package org.upo.eps.it.phama.ws;

import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;

import org.upo.eps.it.phama.bean.Almacen;

import org.upo.eps.it.phama.bean.Cliente;

import org.upo.eps.it.phama.bean.DetallePedCli;
import org.upo.eps.it.phama.bean.DetallePedCliId;
import org.upo.eps.it.phama.bean.Direccion;
import org.upo.eps.it.phama.bean.Empleado;
import org.upo.eps.it.phama.bean.Estado;
import org.upo.eps.it.phama.bean.PedidoCliente;
import org.upo.eps.it.phama.dao.ClienteDAO;
import org.upo.eps.it.phama.bean.Producto;
import org.upo.eps.it.phama.bean.Proveedor;
import org.upo.eps.it.phama.dao.AlmacenDAO;
import org.upo.eps.it.phama.dao.EmpleadoDAO;
import org.upo.eps.it.phama.dao.EstadoDAO;
import org.upo.eps.it.phama.dao.PedidoClienteDAO;
import org.upo.eps.it.phama.dao.ProductoDAO;
import org.upo.eps.it.phama.dao.ProveedorDAO;
import org.upo.eps.it.phama.util.Utils;

/**
 *
 * @author grupo 4
 */
@WebService(serviceName = "pharmaws")
public class PhamaWS {
    
//<editor-fold defaultstate="collapsed" desc="LOGIN">
    @WebMethod(operationName = "login")
    public Empleado login(@WebParam(name = "user") String user, @WebParam(name = "password") String password) {
        Empleado usuario = null;
        try {
            usuario = EmpleadoDAO.getByUsername(user, Utils.getMd5(password));
        } catch (NoSuchAlgorithmException ex) {
            Utils.log("error", ex.getMessage());
        } finally {
            return usuario;
        }
    }
    //</editor-fold>

//<editor-fold defaultstate="collapsed" desc="PEDIDO DE CLIENTES">
    @WebMethod(operationName = "buscarPedidos")
    public List<PedidoCliente> searchPedidos(@WebParam(name = "id") Integer idPedido,
    @WebParam(name = "cliente") Integer idCliente,
    @WebParam(name = "fecha") String fecha) {
        List<PedidoCliente> result = new ArrayList<>();
        idCliente = idCliente == null ? 0 : idCliente;
        idPedido = idPedido == null ? 0 : idPedido;
        fecha = fecha == null ? "" : fecha;
        try {
            result = PedidoClienteDAO.search(idCliente, idPedido, fecha);
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        } finally {
            return result;
        }
    }
    
    @WebMethod(operationName = "guardarPedido")
    public Integer savePedido(@WebParam(name = "idCliente") Integer idCliente,
    @WebParam(name = "idEstado") Integer idEstado,
    @WebParam(name = "fecha") String fecha,
    @WebParam(name = "nota") String nota) {
        Integer result = null;
        try {
            Estado estado = EstadoDAO.getById(idEstado);
            Cliente cliente = ClienteDAO.getById(idCliente);
            SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
            Date date = (Date) formatter.parse(fecha);
            PedidoCliente pedido = new PedidoCliente(estado, cliente, date, nota);
            PedidoClienteDAO.save(pedido);
            result = pedido.getIdPedidoCli();
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        } finally {
            return result;
        }
    }
    
    @WebMethod(operationName = "eliminarPedido")
    public void deletePedido(@WebParam(name = "idPedido") Integer idPedido) {
        try {
            PedidoClienteDAO.delete(idPedido);
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        }
    }
    
    @WebMethod(operationName = "anadirDetallePedido")
    public void anadirDetalle(@WebParam(name = "idPedido") Integer idPedido,
    @WebParam(name = "idProducto") Integer idProducto,
    @WebParam(name = "cantidad") Integer cantidad) {
        try {
            // Obtenemos el objeto persistente correspondiente al idPedido
            PedidoCliente pedido = PedidoClienteDAO.getById(idPedido);
            if (pedido != null) { // pedido siempre debe ser distinto de nulo. No obstante, nos aseguramos.
                Producto producto = ProductoDAO.getById(idProducto);
                int idDet = PedidoClienteDAO.getNextIdDetalle(idPedido);
                
                DetallePedCli detalle = new DetallePedCli();
                DetallePedCliId idDetalle = new DetallePedCliId(idDet + 1, idPedido);
                detalle.setId(idDetalle);
                
                detalle.setPedidoCliente(pedido);
                detalle.setProducto(producto);
                detalle.setCantidad(cantidad);
                
                // Añadidos el artículo de la lista de artículos del pedido
                pedido.getMisDetallesPedCli().add(detalle);
                // Y lo volvemos a persistir
                PedidoClienteDAO.update(pedido);
            }
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        }
    }
    
    @WebMethod(operationName = "eliminarDetallePedido")
    public void eliminarDetalle(@WebParam(name = "idPedido") Integer idPedido,
    @WebParam(name = "idDetalle") Integer idDetalle) {
        try {
            // Obtenemos el objeto persistente correspondiente al idPedido
            PedidoCliente pedido = PedidoClienteDAO.getById(idPedido);
            if (pedido != null) { // pedido siempre debe ser distinto de nulo. No obstante, nos aseguramos.
                DetallePedCli detalle = new DetallePedCli();
                DetallePedCliId id = new DetallePedCliId(idDetalle, idPedido);
                detalle.setId(id);
                // Eliminamos el artículo de la lista de artículos del pedido
                pedido.getMisDetallesPedCli().remove(detalle);
                // Y lo volvemos a persistir
                PedidoClienteDAO.save(pedido);
            }
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        }
    }
//</editor-fold>
    
//<editor-fold defaultstate="collapsed" desc="CLIENTES">
    @WebMethod(operationName = "obtenerClientes")
    public List<Cliente> getClientes() {
        List<Cliente> result = new ArrayList<>();
        try {
            result = ClienteDAO.getCliente();
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        }
        return result;
    }
    
    @WebMethod(operationName = "buscarCliente")
    public List<Cliente> buscarCliente(@WebParam(name = "nombre") String nombre,
            @WebParam(name = "contacto") String contacto,
            @WebParam(name = "email") String email,
            @WebParam(name = "telefono") String telefono){
        List<Cliente> result = new ArrayList<>();
        nombre = nombre == null ? "" : nombre;
        email = email == null ? "" : email;
        telefono = telefono == null ? "" : telefono;
        try {
            result =  ClienteDAO.search(nombre, contacto, email, telefono);
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        }
        return result;
    }
    
    @WebMethod(operationName = "aniadirCliente")
    public void saveCliente(@WebParam(name = "nombre") String nombre,
    @WebParam(name = "contacto") String contacto,
    @WebParam(name = "email") String email,
    @WebParam(name = "telefono") String telefono,
    @WebParam(name = "direccion") String direccion,
    @WebParam(name = "poblacion") String poblacion,
    @WebParam(name = "provincia") String provincia,
    @WebParam(name = "cp") String cp) {
        nombre = nombre == null ? "" : nombre;
        contacto = contacto == null ? "" : contacto;
        email = email == null ? "" : email;
        direccion = direccion == null ? "" : direccion;
        telefono = telefono == null ? "" : telefono;
        poblacion = poblacion == null ? "" : poblacion;
        provincia = provincia == null ? "" : provincia;
        cp = cp == null ? "" : cp;
        
        Direccion dir = new Direccion(direccion, poblacion, provincia, cp);
        Cliente clie = new Cliente(dir, nombre, contacto, email, telefono);
 
        try {
            ClienteDAO.save(clie);
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        }
    }
    
    @WebMethod(operationName = "modificarCliente")
    public void modificarCliente(@WebParam(name = "idCliente") String id,
    @WebParam(name = "nombre") String nombre,
    @WebParam(name = "contacto") String contacto,
    @WebParam(name = "email") String email,
    @WebParam(name = "telefono") String telefono,
    @WebParam(name = "idDireccion") String idDir,
    @WebParam(name = "direccion") String direccion,
    @WebParam(name = "poblacion") String poblacion,
    @WebParam(name = "provincia") String provincia,
    @WebParam(name = "cp") String cp) {
        id = id == null ? "" : id;
        nombre = nombre == null ? "" : nombre;
        contacto = contacto == null ? "" : contacto;
        email = email == null ? "" : email;
        idDir = idDir == null ? "" : idDir;
        direccion = direccion == null ? "" : direccion;
        telefono = telefono == null ? "" : telefono;
        poblacion = poblacion == null ? "" : poblacion;
        provincia = provincia == null ? "" : provincia;
        cp = cp == null ? "" : cp;
        
        Direccion dir = new Direccion(direccion, poblacion, provincia, cp);
        dir.setIdDireccion(Integer.parseInt(idDir));
        Cliente clie = new Cliente(dir, nombre, contacto, email, telefono);
        clie.setIdCliente(Integer.parseInt(id));
        
        try {
            ClienteDAO.save(clie);
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        }
    }
    
    @WebMethod(operationName = "eliminarCliente")
    public void eliminarCliente(@WebParam(name = "idCliente") Integer idCliente) {
        try {
            // Obtenemos el objeto persistente correspondiente al idPedido
            Cliente cliente = ClienteDAO.getById(idCliente);
            if (cliente != null) { // pedido siempre debe ser distinto de nulo. No obstante, nos aseguramos.
                ClienteDAO.delete(idCliente);
            }
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        }
    }
    //</editor-fold>

//<editor-fold defaultstate="collapsed" desc="PRODUCTOS">
    @WebMethod(operationName = "obtenerProductos")
    public List<Producto> getProductos() {
        List<Producto> result = new ArrayList<>();
        try {
            result = ProductoDAO.getProductos();
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        }
        return result;
    }

    @WebMethod(operationName = "buscarProductos")
    //  String nombre, String coste, String precio, String almacen, String proveedor
    public List<Producto> searchProductos(@WebParam(name = "nombre") String nombre, @WebParam(name = "coste") String coste, @WebParam(name = "precio") String precio, @WebParam(name = "almacen") String almacen, @WebParam(name = "proveedor") String proveedor) {
        List<Producto> result = new ArrayList<>();
        nombre = nombre == null ? "" : nombre;
        coste = coste == null ? "" : coste;
        precio = precio == null ? "" : precio;
        almacen = almacen == null ? "" : almacen;
        proveedor = proveedor == null ? "" : proveedor;
        try {
            result = ProductoDAO.search(nombre, coste, precio, almacen, proveedor);
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        } finally {
            return result;
        }
    }

     @WebMethod(operationName = "modificarProducto")
    public void modificarProducto(@WebParam(name = "idProducto") String id,
    @WebParam(name = "nombre") String nombre,
    @WebParam(name = "descripcion") String descripcion,
    @WebParam(name = "coste") Double coste,
    @WebParam(name = "precio") Double precio,
    @WebParam(name = "iva") Double iva,
    @WebParam(name = "idProveedor") Integer idProveedor,
    @WebParam(name = "idAlmacen") Integer idAlmacen) {
          Almacen almacen = AlmacenDAO.getById(idAlmacen);
        Proveedor proveedor = ProveedorDAO.getById(idProveedor);
        nombre = nombre == null ? "" : nombre;
        descripcion = descripcion == null ? "" : descripcion;
        coste = coste == null ? 0 : coste;
        precio = precio == null ? 0 : precio;
        iva = iva == null ? 0 : iva;
     
         Producto p = new Producto(almacen, proveedor, nombre, descripcion, coste, precio, iva);
         
        p.setIdProducto(Integer.parseInt(id));
         
        try {
            ProductoDAO.save(p);
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        }
    }
    
    
    @WebMethod(operationName = "eliminarProductos")
    public void eliminarProducto(@WebParam(name = "idProducto") Integer idProducto) {
        try {
            // Obtenemos el objeto persistente correspondiente al idPedido
            Producto producto = ProductoDAO.getById(idProducto);
            if (producto != null) { // pedido siempre debe ser distinto de nulo. No obstante, nos aseguramos.
                ProductoDAO.delete(idProducto);
                // guardamos los cambios realizados
         //       ProductoDAO.save(producto);
            }
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        }
    }

    @WebMethod(operationName = "aniadirProducto")
    //  String nombre, String coste, String precio, String almacen, String proveedor
    public void saveProductos(@WebParam(name = "nombre") String nombre, @WebParam(name = "descripcion") String descripcion, @WebParam(name = "coste") Double coste, @WebParam(name = "precio") Double precio, @WebParam(name = "iva") Double iva, @WebParam(name = "idAlmacen") Integer idAlmacen, @WebParam(name = "idProveedor") Integer idProveedor) {
        Almacen almacen = AlmacenDAO.getById(idAlmacen);
        Proveedor proveedor = ProveedorDAO.getById(idProveedor);
        nombre = nombre == null ? "" : nombre;
        descripcion = descripcion == null ? "" : descripcion;
        coste = coste == null ? 0 : coste;
        precio = precio == null ? 0 : precio;
        iva = iva == null ? 0 : iva;
        /*
         almacen = almacen == null ? "" : almacen;
         proveedor = proveedor == null ? "" : proveedor;
         */
        Producto p = new Producto(almacen, proveedor, nombre, descripcion, coste, precio, iva);
        try {
            ProductoDAO.save(p);
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        } finally {
        }
    }
    
    
    
   @WebMethod(operationName = "obtenerAlmacenes")
    public List<Almacen> getAlmacen() {
        List<Almacen> result = new ArrayList<>();
        try {
            result = AlmacenDAO.getAlmacenes();
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        }
        return result;
    }
   @WebMethod(operationName = "obtenerProveedores")
    public List<Proveedor> getProveedor() {
        List<Proveedor> result = new ArrayList<>();
        try {
            result = ProveedorDAO.getProveedor();
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        }
        return result;
    }

    //</editor-fold>

//<editor-fold defaultstate="collapsed" desc="ESTADOS">
    @WebMethod(operationName = "obtenerEstados")
    public List<Estado> getEstados() {
        List<Estado> result = new ArrayList<>();
        try {
            result = EstadoDAO.getEstados();
        } catch (Exception ex) {
            Utils.log("error", ex.getMessage());
        }
        return result;
    }
    //</editor-fold>
}